package com.yitiao.multithread.case00;

import java.util.concurrent.CountDownLatch;

/**
 * <h3>模拟了 100 个线程同时对 j 变量执行 100 次 i++ 的操作</h3>
 *
 * <p>result is :9988</p>
 */
public class ThreadDemo {

    private static int j = 0;

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch start = new CountDownLatch(1);
        CountDownLatch end = new CountDownLatch(100);
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                try {
                    start.await();  // 等待所有线程都启动再执行加一操作
                    for (int t = 0; t < 100; t++) {
                        j++;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    end.countDown();
                }
            }).start();
        }
        start.countDown();
        end.await();  // 所有线程的操作都结束再打印
        System.out.println("result is :" + j);
    }

    /**
     * i++ 的汇编指令：将 i 变量挪到 CPU 的一个寄存器中，然后进行自增，接着将 i 移出寄存器放回原先的内存地址中。
     * mov     eax, DWORD PTR i[rip]
     * add     eax, 1
     * mov     DWORD PTR i[rip], eax
     */
}
